<!DOCTYPE html>
<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api-1/#cssom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
  @property --valid {
    syntax: "<color> | none";
    inherits: false;
    initial-value: red;
  }
  @property --valid-reverse {
    initial-value: 0px;
    inherits: true;
    syntax: "<length>";
  }
  @property --valid-universal {
    syntax: "*";
    inherits: false;
  }
  @property --valid-whitespace {
    syntax: " <color># ";
    inherits: false;
    initial-value: red, blue;
  }
  @property --vALId {
    syntax: "<color> | none";
    inherits: false;
    initial-value: red;
  }
  @property --no-descriptors {

  }
  @property --no-syntax {
    inherits: false;
    initial-value: red;
  }
  @property --no-inherits {
    syntax: "<color> | none";
    initial-value: red;
  }
  @property --no-initial-color-value {
    syntax: "<color> | none";
    inherits: false;
  }
  @property --no-initial-universal-value {
    syntax: "*";
    inherits: false;
  }
  @property --syntax-only {
    syntax: "<color> | none";
  }
  @property --inherits-only {
    inherits: true;
  }
  @property --initial-value-only {
    initial-value: red;
  }
  /* U+0009 CHARACTER TABULATION */
  @property --tab\9 tab {
    syntax: "*";
    inherits: true;
  }
</style>
<script>

function find_at_property_rule(name) {
  for (let rule of document.styleSheets[0].cssRules) {
    if (rule.constructor.name != "CSSPropertyRule")
      continue;
    if (rule.name == name)
      return rule;
  }
  return null;
}

function test_invalid(name) {
  test(() => {
    let rule = find_at_property_rule(name);
    assert_true(!rule);
  }, `Rule for ${name} is invalid`);
}

function test_css_text(name, expected) {
  test(() => {
    let rule = find_at_property_rule(name);
    assert_true(!!rule);
    assert_equals(rule.cssText, expected);
  }, `Rule for ${name} has expected cssText`);
}

function test_name(name) {
  test(() => {
    let rule = find_at_property_rule(name);
    assert_true(!!rule);
    assert_equals(rule.name, name);
  }, `Rule for ${name} returns expected value for CSSPropertyRule.name`);
}

function test_syntax(name, expected) {
  test(() => {
    let rule = find_at_property_rule(name);
    assert_true(!!rule);
    assert_equals(rule.syntax, expected);
  }, `Rule for ${name} returns expected value for CSSPropertyRule.syntax`);
}

function test_inherits(name, expected) {
  test(() => {
    let rule = find_at_property_rule(name);
    assert_true(!!rule);
    assert_equals(rule.inherits, expected);
  }, `Rule for ${name} returns expected value for CSSPropertyRule.inherits`);
}

function test_initial_value(name, expected) {
  test(() => {
    let rule = find_at_property_rule(name);
    assert_true(!!rule);
    assert_equals(rule.initialValue, expected);
  }, `Rule for ${name} returns expected value for CSSPropertyRule.initialValue`);
}

// Invalid @property rules.
test_invalid('--no-descriptors');
test_invalid('--no-syntax');
test_invalid('--no-inherits');
test_invalid('--no-initial-color-value');
test_invalid('--syntax-only', '@property --syntax-only { syntax: "<color> | none"; }');
test_invalid('--inherits-only', '@property --inherits-only { inherits: true; }');
test_invalid('--initial-value-only', '@property --initial-value-only { initial-value: red; }');

// CSSPropertyRule.cssText

test_css_text('--valid', '@property --valid { syntax: "<color> | none"; inherits: false; initial-value: red; }');
test_css_text('--valid-reverse', '@property --valid-reverse { syntax: "<length>"; inherits: true; initial-value: 0px; }');
test_css_text('--valid-universal', '@property --valid-universal { syntax: "*"; inherits: false; }');
test_css_text('--valid-whitespace', '@property --valid-whitespace { syntax: " <color># "; inherits: false; initial-value: red, blue; }');
test_css_text('--vALId', '@property --vALId { syntax: "<color> | none"; inherits: false; initial-value: red; }');

test_css_text('--no-initial-universal-value', '@property --no-initial-universal-value { syntax: "*"; inherits: false; }');

test_css_text('--tab\ttab', '@property --tab\\9 tab { syntax: "*"; inherits: true; }');

// CSSRule.type

test(() => {
  let rule = find_at_property_rule('--valid');
  assert_equals(rule.type, 0);
}, 'CSSRule.type returns 0');

// CSSPropertyRule.name

test_name('--valid');
test_name('--valid-reverse');
test_name('--valid-universal');
test_name('--valid-whitespace');
test_name('--vALId');

test_name('--no-initial-universal-value');

// CSSPropertyRule.syntax

test_syntax('--valid', '<color> | none');
test_syntax('--valid-reverse', '<length>');
test_syntax('--valid-universal', '*');
test_syntax('--valid-whitespace', ' <color># ');
test_syntax('--vALId', '<color> | none');

test_syntax('--no-initial-universal-value', '*');

// CSSPropertyRule.inherits

test_inherits('--valid', false);
test_inherits('--valid-reverse', true);
test_inherits('--valid-universal', false);
test_inherits('--valid-whitespace', false);
test_inherits('--vALId', false);

test_inherits('--no-initial-universal-value', false);

// CSSPropertyRule.initialValue

test_initial_value('--valid', 'red');
test_initial_value('--valid-reverse', '0px');
test_initial_value('--valid-universal', null);
test_initial_value('--valid-whitespace', 'red, blue');
test_initial_value('--vALId', 'red');

test_initial_value('--no-initial-universal-value', null);

</script>
